home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 306.adf / Tree / tree.c < prev   
C/C++ Source or Header  |  1990-01-11  |  3KB  |  163 lines

  1. #include "stdio.h"
  2. #include "libraries/dos.h"
  3. extern struct Lock *Lock() ;
  4. extern void *malloc() ;
  5. char path[1000] ;
  6. struct FileInfoBlock *fibs[100] ;
  7. extern int Enable_Abort ;
  8. int aborted ;
  9. /*
  10.  *   Implements a `string set'.  Simple linear search.
  11.  */
  12. struct stringset {
  13.    struct stringset *next ;
  14.    char what[1] ;
  15. } ;
  16. struct stringset *add(s, ss)
  17. char *s ;
  18. struct stringset *ss ;
  19. {
  20.    struct stringset *t ;
  21.  
  22.    t = (struct stringset *)malloc(sizeof(struct stringset) + strlen(s)) ;
  23.    t->next = ss ;
  24.    strcpy(t->what, s) ;
  25.    return t ;
  26. }
  27. int member(s, ss)
  28. register char *s ;
  29. register struct stringset *ss ;
  30. {
  31.    while (ss != 0) {
  32.       if (strcmp(s, ss->what)==0)
  33.          return 1 ;
  34.       ss = ss->next ;
  35.    }
  36.    return 0 ;
  37. }
  38. struct stringset *dirlist, *extlist ;
  39. checkcontrolc() {
  40.    long _SetSignal() ;
  41.  
  42.    if ((_SetSignal(0L, 0x1000L))&0x1000)
  43.       aborted = 1 ;
  44. }
  45. checkext(s)
  46. register char *s ;
  47. {
  48.    register char *p = 0 ;
  49.  
  50.    while (*s) {
  51.       if (*s == '.')
  52.          p = s + 1 ;
  53.       s++ ;
  54.    }
  55.    return ((p==0) || ! member(p, extlist)) ;
  56. }
  57. char *mformat = "%s" ;
  58. char outline[2000] ;
  59. tree(s, l)
  60. register char *s ;
  61. register int l ;
  62. {
  63.    register struct Lock *lk ;
  64.    register struct FileInfoBlock *fib = fibs[l] ;
  65.    register char *p, *q, *r ;
  66.  
  67.    if (fib == 0) {
  68.       fib = (struct FileInfoBlock *)malloc(sizeof(struct FileInfoBlock)) ;
  69.       fibs[l] = fib ;
  70.    }
  71.    lk = Lock(s) ;
  72.    if (lk == NULL ||
  73.        (Examine(lk, fib) && fib->fib_DirEntryType <= 0)) {
  74.       return ;
  75.    }
  76.    r = s + strlen(s) ;
  77.    while (! aborted && ExNext(lk, fib)) {
  78.       strcpy(r, fib->fib_FileName) ;
  79.       if (fib->fib_DirEntryType <= 0) {
  80.          if (checkext(r)) {
  81.             p = outline ;
  82.             q = mformat ;
  83.             while (*q) {
  84.                if (*q == '%') {
  85.                   q++ ;
  86.                   switch (*q) {
  87. case 's' :
  88.                      strcpy(p, s) ;
  89.                      p += strlen(p) ;
  90.                      q++ ;
  91.                      break ;
  92. case 'd' :
  93.                      sprintf(p, "%10ld", fib->fib_Size) ;
  94.                      p += strlen(p) ;
  95.                      q++ ;
  96.                      break ;
  97. default:
  98.                      *p++ = *q++ ;
  99.                      break ;
  100.                   }
  101.                } else {
  102.                   *p++ = *q++ ;
  103.                }
  104.             }
  105.             *p = 0 ;
  106.             printf("%s\n", outline) ;
  107.          }
  108.       } else {
  109.          if (! member(s, dirlist)) {
  110.             strcat(s, "/") ;
  111.             tree(s, l+1) ;
  112.          }
  113.       }
  114.       checkcontrolc() ;
  115.    }
  116.    UnLock(lk) ;
  117. }
  118. main(argc, argv)
  119. int argc ;
  120. char *argv[] ;
  121. {
  122.    register char *p, *q ;
  123.    int option = 'f' ;
  124.  
  125.    Enable_Abort = 0 ;
  126.    while (argc > 1) {
  127.       argc-- ;
  128.       argv++ ;
  129.       p = *argv ;
  130.       if (*p == '-') {
  131.          option = p[1] ;
  132.          q = p + 2 ;
  133.          if (*q == 0) {
  134.             argc-- ;
  135.             argv++ ;
  136.             if (argc <= 0)
  137.                break ;
  138.             q = *argv ;
  139.          }
  140.       } else
  141.          q = p ;
  142.       switch (option) {
  143. case 'd': case 'D':
  144.          dirlist = add(q, dirlist) ;
  145.          break ;
  146. case 'x': case 'X': case 'e': case 'E':
  147.          extlist = add(q, extlist) ;
  148.          break ;
  149. case 'f': case 'F':
  150.          mformat = q ;
  151.          break ;
  152. case '?': case 'H': case 'h':
  153.          printf(
  154. "Usage:  tree [-d directoryname] [-x extension] [-f format] [-?]\n") ;
  155.          exit(0) ;
  156. default:
  157.          break ;
  158.       }
  159.    }
  160.    tree(path, 0) ;
  161. }
  162. _wb_parse() {}
  163.